////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxifebpcbcc50.h
/// @brief camxifebpcbcc50 class declarations
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXIFEBPCBCC50_H
#define CAMXIFEBPCBCC50_H

#include "bpcbcc_5_0_0.h"
#include "camxformats.h"
#include "camxispiqmodule.h"
#include "camxsensorproperty.h"
#include "titan170_ife.h"

#include "iqcommondefs.h"

CAMX_NAMESPACE_BEGIN

CAMX_BEGIN_PACKED

/// @brief IFE BPCBCC Module Register Set
struct IFEBPCBCC50RegCmd
{
    IFE_IFE_0_VFE_BPC_CFG_0     configRegister0;  ///< Config Register 0. Offset: 0x5c4
    IFE_IFE_0_VFE_BPC_CFG_1     configRegister1;  ///< Config Register 1. Offset: 0x5c8
    IFE_IFE_0_VFE_BPC_CFG_2     configRegister2;  ///< Config Register 2. Offset: 0x5cc
    IFE_IFE_0_VFE_BPC_CFG_3     configRegister3;  ///< Config Register 3. Offset: 0x5D0
    IFE_IFE_0_VFE_BPC_CFG_4     configRegister4;  ///< Config Register 4. Offset: 0x5D4
    IFE_IFE_0_VFE_BPC_CFG_5     configRegister5;  ///< Config Register 5. Offset: 0x5D8
    IFE_IFE_0_VFE_BPC_CFG_6     configRegister6;  ///< Config Register 6. Offset: 0x5DC
    IFE_IFE_0_VFE_BPC_DPC_STATS statsRegister;    ///< Stats Counter of Corrected Pixels. Offset: 5E0
} CAMX_PACKED;

CAMX_END_PACKED


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Class for IFE BPCBCC50 Module
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class IFEBPCBCC50 final : public ISPIQModule
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Create
    ///
    /// @brief  Create IFEBPCBCC50 Object
    ///
    /// @param  pCreateData Pointer to data for IFEBPCBCC50 Creation
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult Create(
        IFEModuleCreateData* pCreateData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Initialize
    ///
    /// @brief  Initialize parameters
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult Initialize();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Execute
    ///
    /// @brief  Generate Settings for IFEBPCBCC50 Object
    ///
    /// @param  pInputData Pointer to the Inputdata
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult Execute(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetRegCmd
    ///
    /// @brief  Retrieve the buffer of the register value
    ///
    /// @return Pointer of the register buffer
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID* GetRegCmd();

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~IFEBPCBCC50
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~IFEBPCBCC50();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// IFEBPCBCC50
    ///
    /// @brief  Constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    IFEBPCBCC50();

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// AllocateCommonLibraryData
    ///
    /// @brief  Allocate memory required for common library
    ///
    /// @return CamxResult success if the write operation is success
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult AllocateCommonLibraryData();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// DeallocateCommonLibraryData
    ///
    /// @brief  Deallocate memory required for common library
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID DeallocateCommonLibraryData();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CheckDependenceChange
    ///
    /// @brief  Check if the Dependence Data has changed
    ///
    /// @param  pInputData Pointer to the Input Data
    ///
    /// @return TRUE if dependencies met
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL CheckDependenceChange(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// RunCalculation
    ///
    /// @brief  Perform the Interpolation and Calculation
    ///
    /// @param  pInputData Pointer to the Input Data
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult RunCalculation(
        const ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// PrepareStripingParameters
    ///
    /// @brief  Prepare striping parameters for striping lib
    ///
    /// @param  pInputData Pointer to the Inputdata
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult PrepareStripingParameters(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CreateCmdList
    ///
    /// @brief  Generate the Command List
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult CreateCmdList(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// DumpRegConfig
    ///
    /// @brief  Print register configuration of IFE BPCBCC module for debug
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID DumpRegConfig() const;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// UpdateIFEInternalData
    ///
    /// @brief  Update IFE internal data
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID UpdateIFEInternalData(
        ISPInputData* pInputData);

    IFEBPCBCC50(const IFEBPCBCC50&)            = delete;     ///< Disallow the copy constructor
    IFEBPCBCC50& operator=(const IFEBPCBCC50&) = delete;     ///< Disallow assignment operator

    BPCBCC50InputData                     m_dependenceData;  ///< Dependence Data for this Module
    IFEBPCBCC50RegCmd                     m_regCmd;          ///< Register List of this Module
    HotPixelModeValues                    m_hotPixelMode;    ///< Hot pixel mode
    bpcbcc_5_0_0::chromatix_bpcbcc50Type* m_pChromatix;      ///< Pointer to tuning mode data
};

CAMX_NAMESPACE_END

#endif // CAMXIFEBPCBCC50_H
